#include <bits/stdc++.h>

#define ll long long
#define ull unsigned long long
#define uint unsigned int

#define YES cout << "Yes" << '\n'
#define NO cout << "No" << '\n'
#define endl '\n'
const int INF = 1e9;
const int MOD = 1;
using namespace std;
/*思考
 *
 */
void solve()
{
    int n;
    cin >> n;
    vector<int> d(n);
    for (int i = 0; i < n; ++i)
    {
        cin >> d[i];
    }
    vector<int> l(n), r(n);
    for (int i = 0; i < n; ++i)
    {
        cin >> l[i] >> r[i];
    }
    
    int high = 0;
    vector<int> last;
    for (int i = 0; i < n; ++i)
    {
        if (d[i] == -1)
        {
            last.push_back(i);// 如果当前步骤未知，把它记录到 last 里
        }
        else
        {
            high += d[i];// 如果当前 di 确定，就更新当前高度
        }
        
        while (high < l[i])// 处理不能满足 li 要求的情况（高度不够）
        {
            if (last.empty())// 没有可以设置为 1 的位置，无法提升高度，输出 -1
            {
                cout << -1 << endl;
                return;
            }
            d[last.back()] = 1;// 把最近一个未定的步骤设为 1，提升高度
            ++high;
            last.pop_back();// 处理完后把这个位置从 last 中删除
        }
        
        while (high + last.size() > r[i])// 处理不能满足 ri 要求的情况（可能超高）
        {
            if (last.empty())// 没有可调节的步骤，但当前高度 + 未定步数 > ri，无法降低
            {
                cout << -1 << endl;
                return;
            }
            d[last.back()] = 0;// 把最近一个未定的步骤设为 0，避免超高
            last.pop_back();// 处理完后把这个位置从 last 中删除
        }

    }
    for (int i = 0; i < n; ++i)
    {
        cout << max(0, d[i]) << " ";
    }
    cout << endl;
    return;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int t = 0;
    cin >> t;
    while (t--)
        solve();
    return 0;
}